#ifndef _RENDERER_H_
#define _RENDERER_H_

#include "common.h"
#include "AssetManager.h"
#include "FontManager.h"
#include "Camera.h"
#include "Timer.h"
#include "Mathematics.h"

class CRenderer
{

private:

	//////////////////////////////////////////////////////////////////////////
	// Window Parameters
	HWND		m_hwnd;
	HINSTANCE	m_hInstance;
	int			m_nScreenWidth;
	int			m_nScreenHeight;
	bool		m_bWindowed;

	//////////////////////////////////////////////////////////////////////////
	// DirectX Devices
	IDirect3D9*				m_pD3D;
	IDirect3DDevice9*		m_pDev;
	D3DPRESENT_PARAMETERS	m_D3DPP;

	//////////////////////////////////////////////////////////////////////////
	// Camera Settings
	float		m_fFOV;
	float		m_fAspectRatio;
	float		m_fNearPlane;
	float		m_fFarPlane;
	PHVEC3	m_phCameraView;
	
	//////////////////////////////////////////////////////////////////////////
	// Utilities
	bool			m_bInitialized;
	bool			m_bReseting;
	HRESULT			m_Error;
	CAssetManager*	m_pAssetManager;
	CFontManager*	m_pFontManager;

	//////////////////////////////////////////////////////////////////////////
	// Temporary Values TBR (To Be Removed)
	PHMATRIX	m_phTransform;
	int			m_phSamusID;
	CCamera		m_cCamera;
	CTimer		m_cTimer;

	//////////////////////////////////////////////////////////////////////////
	// DirectX Device Functions
	void CreateDevice();
	void OnDeviceLost();
	void ResetDevice();

	//////////////////////////////////////////////////////////////////////////
	// Camera Controls
	bool UpdateCamera(void);

public:
	
	//////////////////////////////////////////////////////////////////////////
	// Constructor and Destructor
	CRenderer(void);
	~CRenderer(void);

	//////////////////////////////////////////////////////////////////////////
	// Renderer Functions
	bool Initialize(float fFOV = D3DX_PI / 3, float fNearPlane = 0.1f, float fFarPlane = 1000.0f, PHVEC3 phCameraView = PHVEC3(0.0f, 0.0f, 0.0f));
	bool InitD3D(HWND hWnd, HINSTANCE hInstance, int nScreenWidth, int nScreenHeight, bool bWindowed);
	bool Update(void);
	void Render(void);
	bool Shutdown(void);

	void RenderX(PhModelID _phID);
	void RenderText(void);

	//////////////////////////////////////////////////////////////////////////
	// Accessors
	inline IDirect3D9* GetD3D(void) { return m_pD3D; }
	inline IDirect3DDevice9* GetDevice(void) { return m_pDev; }
	inline HWND GetHWND(void) { return m_hwnd; }
	inline int GetScreenWidth(void) { return m_nScreenWidth; }
	inline int GetScreenHeight(void) { return m_nScreenHeight; }
	inline bool GetWindowed(void) { return m_bWindowed; }


};

#endif